/**
 * Werwolftool-Spielleiterfunktionen
 * @author JANNiS <jannis@huffle-home.de>
 */

/**
 * Klasse für die Infobox mit Funktionen und grafischen Effekten
 */
var DarstellungInfobox = new Class({
	/**
	 * Der grafische Effekt um die Kategorien auf- und zuzuklappen
	 */
	accordion: null,
	/**
	 * Der grafische Effekt um die Box rein- und rauszufahren
	 */
	slide: null,
	
	/**
	 * Konstruktor, bereitet die Infobox vor
	 * Macht die Box ein- und ausfahrbar und die Kategorien auf- und zuklappbar
	 * und ruft die Textfeld- und Buttons-Initialisierung auf
	 */
	initialize: function() {
		// Infos als Accordion (titel [zum auf und zu klappen] und inhalt [wird auf und zu geklappt])
		this.accordion = new Fx.Accordion($$(".infoboxtitel"), $$(".infoboxinhalt"));
		// Box horizontal ein- und ausfahrbar machen
		this.slide = new Fx.Slide("infobox", {mode: "horizontal"});
		// Box ausblenden
		this.hide();
		
		// Feldfunktionen hinzufügen
		this.initFields();
		// Buttonfunktionen hinzufügen
		this.initButtons();
	},
	
	/**
	 * Weist den Buttons "Übernehmen" und "Abbrechen" die Funktion zu
	 */
	initButtons: function() {
		// Wenn auf "Spieler löschen" geklickt wurde ...
		$("spielerloeschen").addEvent("click", function() {
			// Spielernamen merken
			var spieler = $("spielername").get("value");
			// Spieler löschen
			spiel.spielerEntfernen(spieler);
			// Spielerliste aktualisieren
			darstellung.spielerliste.aktualisieren();
			// Box rausfahren
			darstellung.infobox.slideOut();
			// Accordion auf oberstes Element (Spieler) schalten
			darstellung.infobox.accordion.display(0);
		});
		
		// Wenn auf "Übernehmen" geklickt wurde oder das Formular auf eine andere Weise abgesendet wurde ...
		$("infoboxformular").addEvent("submit", function(e) {
			// Standard-Event (Formular absenden und damit Seite neuladen) abbrechen
			e.stop();
			// Daten speichern
			darstellung.infobox.speichern();
		});
		// Wenn auf "Abbrechen" geklickt wurde ...
		$("infoboxAbbrechenButton").addEvent("click", function() {
			// Box rausfahren
			darstellung.infobox.slideOut();
		});
	},
	/**
	 * Weist dem Rollen-Textfeld das Tipp-Ereignis zu
	 */
	initFields: function() {
		// Wenn eine Taste im Textfeld gedrückt wird...
		$("rolle").addEvent("keyup", function(e) {
			// lade Rollenbeschreibung
			darstellung.infobox.ladeBeschreibung();
		});
	},
	
	/**
	 * Fügt dem Stimm-Auswahlfeld die aktuellen Spieler hinzu
	 */
	aktualisiereStimmen: function() {
		// Auswahlbox leeren
		$("stimme").empty();
		// Leeren Eintrag erstellen
		var leereOption = new Element("option", {"text": ""});
		// Leeren Eintrag zur Auswahlbox hinzufügen
		$("stimme").grab(leereOption);
		// Für jeden Spieler ...
		spiel.spieler.each(function(spieler) {
			// Auswahloption für Spieler erstellen
			var spielerOption = new Element("option", {"text": spieler.get("name")});
			// Auswahloption zur Auswahlbox hinzufügen
			$("stimme").grab(spielerOption);
		});
	},
	
	/**
	 * Zeigt die Daten eines Spielers in der Infobox an
	 * und fährt die Box rein
	 */
	zeigeSpieler: function(name) {
		// Spieler-Infos holen
		var spieler = spiel.getSpieler(name);
		// Merken, welcher Spieler gerade angezeigt wird
		$("spielername").set("value", spieler.get("name"));
		
		// Notiz für Spieler-Rubrik setzen
		$("spielertitel").set("text", spieler.get("name"));
		// Spieler-Name anzeigen
		$("name").set("value", spieler.get("name"));
		// Spieler-Notizen anzeigen
		$("notizen").set("value", spieler.get("notizen"));
		
		// Notiz für Rollen-Rubrik setzen
		$("rollentitel").set("text", spieler.get("rolle").get("name"));
		// Rolle des Spielers anzeigen
		$("rolle").set("value", spieler.get("rolle").get("name"));
		// Beschreibung zur Rolle anzeigen
		$("beschreibung").set("value", spieler.get("rolle").get("beschreibung"));
		
		// falls Stimme nicht gesetzt ...
		if(spieler.get("stimme") == null) {
			// Notiz für Stimmen-Rubrik auf keine setzen
			$("stimmentitel").set("text", "keine");
		}
		// ... sonst ...
		else {
			// Notiz für Stimmen-Rubrik setzen
			$("stimmentitel").set("text", spieler.get("stimme"));
		}
		// Auswahlmöglichkeiten für Stimme merken
		var options = $("stimme").options;
		// Jede Auswahlmöglichkeit durchgehen...
		Array.each(options, function(option) {
			// falls der Spieler noch nicht gestimmt hat und die Option leer ist ...
			if(spieler.get("stimme") == null && option.get("text") == "") {
				// leere Option auswählen
				option.set("selected", true);
			}
			// ... sonst falls sie den gewünschten Namen trägt ...
			else if(option.get("text") == spieler.get("stimme")) {
				// auswählen
				option.set("selected", true);
			}
			// ... sonst ...
			else {
				// nicht auswählen
				option.set("selected", false);
			}
		});
		// Schussliste anzeigen
		$("schussliste").set("value", spieler.get("schussliste"));
		
		// Beschriftung für Löschbutton ("xyz entfernen")
		var loeschen = spieler.get("name") + " entfernen";
		// Namen auf dem Löschen-Button anzeigen
		$("spielerloeschen").set("value", loeschen);
		
		// Box anzeigen
		this.slideIn();
		// Auswertungsbox schliessen
		darstellung.auswertungsbox.slideOut();
	},
	
	/**
	 * Wenn die Rolle geändert wird, soll die Beschreibung auf die neue Rolle geändert werden
	 */
	ladeBeschreibung: function() {
		// Rollenname auslesen
		var name = $("rolle").get("value");
		// Rolle laden, falls sie existiert
		var rolle = spiel.getRolle(name);
		// falls die Rolle existiert ...
		if(rolle != null) {
			// Beschreibung in das Textfeld schreiben
			$("beschreibung").set("value", rolle.get("beschreibung"));
		}
	},
	
	/**
	 * Übernimmt die Daten der Infobox und speichert sie beim Spieler
	 * und fährt die Box raus
	 */
	speichern: function() {
		// Spieler holen
		var spieler = spiel.getSpieler($("spielername").get("value"));
		
		// falls bisher eine Stimme gewählt war ...
		if(spieler.get("stimme") != null) {
			// bisheriges "Opfer" merken
			var opfer = spiel.getSpieler(spieler.get("stimme"));
			// Spieler aus der Liste des bisherigen Opfers löschen
			opfer.set("stimmen", opfer.get("stimmen").erase(spieler.get("name")));
		}
		
		// neuen Namen merken
		var name = $("name").get("value").clean();
		// falls der Name nicht leer ist und Spieler noch nicht existiert ...
		if(name != "" && !spiel.kenntSpieler(name)) {
			// Deaktiviert
			alert("Oh, umbenennen geht gerade nicht. Kommt aber wieder. Versprochen.");
		}
		// Notizen speichern
		spieler.notizen = $("notizen").get("value");
		
		// Rollenname merken
		var rollenname = $("rolle").get("value").clean();
		// falls Rolle nicht bereits stimmt ...
		if(spieler.get("rolle").get("name") != rollenname) {
			// Rolle speichern
			spieler.set("rolle", rollenname);
		}
		// Rollen-Beschriebung speichern
		spieler.get("rolle").set("beschreibung", $("beschreibung").get("value"));
		
		// Stimmenauswahl merken
		var stimme = $("stimme").getSelected();
		// falls Stimme gewählt (Auswahl getroffen und nicht leer) ...
		if(stimme.length != 0  && stimme[0].get("text") != "") {
			// neues "Opfer" merken (1. markierten Element, da nur eines markiert sein kann)
			var opfer = spiel.getSpieler(stimme[0].get("text"));
			// falls der Spieler nicht mehr existiert ...
			if(opfer == null) {
				// Stimme löschen
				spieler.set("stimme", null);
			}
			// ... sonst ...
			else {
				// Stimme speichern 
				spieler.set("stimme", opfer.get("name"));
				// beim Opfer die Stimme vermerken
				opfer.set("stimmen", opfer.get("stimmen").include(spieler.get("name")));
			}
		}
		// ... sonst ...
		else {
			// ... Stimme löschen
			spieler.set("stimme", null);
		}
		// Schussliste speichern
		spieler.set("schussliste", $("schussliste").get("value"));
		
		// Auswertungsbox ausblenden
		darstellung.auswertungsbox.slideOut();
		// Spielerliste aktualisieren
		darstellung.spielerliste.aktualisieren();
		// Infobox wieder ausblenden
		this.slideOut();
	},
	
	/**
	 * Blendet die Box raus
	 * Kurzform von Fx.Slide.hide();
	 */
	hide: function() {
		// Weitergeben an den Slide
		this.slide.hide();
	},
	/**
	 * Fährt die Box rein
	 * Kurzform von Fx.Slide.slideIn();
	 */
	slideIn: function() {
		// Weitergeben an den Slide
		this.slide.slideIn();
	},
	/**
	 * Fährt die Box raus
	 * Kurzform von Fx.Slide.slideOut();
	 */
	slideOut: function() {
		// Weitergeben an den Slide
		this.slide.slideOut();
	},
	/**
	 * Fährt die Box rein- oder raus (jeweils das andere des aktuellen Status)
	 * Kurzform von Fx.Slide.toggle();
	 */
	toggle: function() {
		// Weitergeben an den Slide
		this.slide.toggle();
	}
});